import SparkMD5 from 'spark-md5';
import Exif from 'exif-js'
let util = {};

/**
 * 计算文件MD5
 * @param {Object} file    ----  文件
 * @param {Object} callback ---  计算结果回调
 */
util.fileMd5 = function (file, callback) {
	let blobSlice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice;
	let chunkSize = 2097152;
	let chunks = Math.ceil(file.size / chunkSize);
	let currentChunk = 0;
	let spark = new SparkMD5.ArrayBuffer();
	let fileReader = new FileReader();
	fileReader.onload = function (e) {
		console.log('read chunk nr', currentChunk + 1, 'of', chunks);
		spark.append(e.target.result);
		currentChunk++;
		if (currentChunk < chunks) {
			loadNext();
		} else {
			console.log('finished loading');
			let md5value = spark.end();
			callback(md5value);
		}
	};
	fileReader.onerror = function () {
		console.warn('oops, something went wrong.');
	}

	function loadNext() {
		var start = currentChunk * chunkSize,
			end = ((start + chunkSize) >= file.size) ? file.size : start + chunkSize;

		fileReader.readAsArrayBuffer(blobSlice.call(file, start, end));
	}
	loadNext();
};
/**
 * 读取文件通过回调函数返回读取的BASE64的值
 * @param {Object} file
 * @param {Object} callback
 */
util.readFile = function (file, callback) {
	// console.log(file);
	let Orientation;
	Exif.getData(file, function () {
		Orientation = Exif.getTag(file, 'Orientation');
		console.log(Orientation);
	});
	// let fileReader = new FileReader();
	// fileReader.readAsDataURL(file);
	// fileReader.onload = function () {
	// 	let result = fileReader.result;
	// 	callback(result, file);
	// }

	if (/^image/.test(file.type)) {
		// 创建一个reader
		let reader = new FileReader();
		// 将图片2将转成 base64 格式
		reader.readAsDataURL(file);
		// 读取成功后的回调
		reader.onloadend = function () {
			let result = this.result;
			let img = new Image();
			img.src = result;
			//判断图片是否大于100K,是就直接上传，反之压缩图片
			if (this.result.length <= (300 * 1024)) {
				callback(result, file);
			} else {
				img.onload = function () {
					let data = compress(img, Orientation);
					callback(data, file);
				}
			}
		}
	}
}

/**
 * 读取文件通过回调函数返回读取的BASE64的值
 * @param {Object} file
 * @param {Object} callback
 */
util.readFileData = function (fileData, callback) {
	let file = fileData.file;
	let fileReader = new FileReader();
	fileReader.readAsDataURL(file);
	fileReader.onload = function () {
		let result = fileReader.result;
		fileData.result = result;
		callback(fileData);
	}
}

//图片压缩
function compress(img, Orientation) {
	let canvas = document.createElement("canvas");
	let ctx = canvas.getContext('2d');
	//瓦片canvas
	let tCanvas = document.createElement("canvas");
	let tctx = tCanvas.getContext("2d");
	let initSize = img.src.length;
	let width = img.width;
	let height = img.height;
	//如果图片大于四百万像素，计算压缩比并将大小压至400万以下
	let ratio;
	if ((ratio = width * height / 4000000) > 1) {
		console.log("大于400万像素")
		ratio = Math.sqrt(ratio);
		width /= ratio;
		height /= ratio;
	} else {
		ratio = 1;
	}
	canvas.width = width;
	canvas.height = height;
	//        铺底色
	ctx.fillStyle = "#fff";
	ctx.fillRect(0, 0, canvas.width, canvas.height);
	//如果图片像素大于100万则使用瓦片绘制
	let count;
	if ((count = width * height / 1000000) > 1) {
		console.log("超过100W像素");
		count = ~~(Math.sqrt(count) + 1); //计算要分成多少块瓦片
		//            计算每块瓦片的宽和高
		let nw = ~~(width / count);
		let nh = ~~(height / count);
		tCanvas.width = nw;
		tCanvas.height = nh;
		for (let i = 0; i < count; i++) {
			for (let j = 0; j < count; j++) {
				tctx.drawImage(img, i * nw * ratio, j * nh * ratio, nw * ratio, nh * ratio, 0, 0, nw, nh);
				ctx.drawImage(tCanvas, i * nw, j * nh, nw, nh);
			}
		}
	} else {
		ctx.drawImage(img, 0, 0, width, height);
	}
	//修复ios上传图片的时候 被旋转的问题
	if (Orientation != "" && Orientation != 1) {
		switch (Orientation) {
			case 6: //需要顺时针（向左）90度旋转
				rotateImg(img, 'left', canvas);
				break;
			case 8: //需要逆时针（向右）90度旋转
				rotateImg(img, 'right', canvas);
				break;
			case 3: //需要180度旋转
				rotateImg(img, 'right', canvas); //转两次
				rotateImg(img, 'right', canvas);
				break;
		}
	}
	//进行最小压缩
	let ndata = canvas.toDataURL('image/jpeg', 1);
	console.log('压缩前：' + initSize);
	console.log('压缩后：' + ndata.length);
	console.log('压缩率：' + ~~(100 * (initSize - ndata.length) / initSize) + "%");
	tCanvas.width = tCanvas.height = canvas.width = canvas.height = 0;
	return ndata;
}
//纠正图片旋转问题
function rotateImg(img, direction, canvas) {
	//最小与最大旋转方向，图片旋转4次后回到原方向    
	const min_step = 0;
	const max_step = 3;
	if (img == null) return;
	//img的高度和宽度不能在img元素隐藏后获取，否则会出错    
	let height = img.height;
	let width = img.width;
	let step = 2;
	if (step == null) {
		step = min_step;
	}
	if (direction == 'right') {
		step++;
		//旋转到原位置，即超过最大值    
		step > max_step && (step = min_step);
	} else {
		step--;
		step < min_step && (step = max_step);
	}
	//旋转角度以弧度值为参数    
	let degree = step * 90 * Math.PI / 180;
	let ctx = canvas.getContext('2d');
	switch (step) {
		case 0:
			canvas.width = width;
			canvas.height = height;
			ctx.drawImage(img, 0, 0);
			break;
		case 1:
			canvas.width = height;
			canvas.height = width;
			ctx.rotate(degree);
			ctx.drawImage(img, 0, -height);
			break;
		case 2:
			canvas.width = width;
			canvas.height = height;
			ctx.rotate(degree);
			ctx.drawImage(img, -width, -height);
			break;
		case 3:
			canvas.width = height;
			canvas.height = width;
			ctx.rotate(degree);
			ctx.drawImage(img, -width, 0);
			break;
	}
}
export default util;